package User;

import java.lang.reflect.InvocationTargetException;

public class Main
{
    public static void main (String[] args)
            throws ClassNotFoundException,
            NoSuchMethodException,
            InvocationTargetException,
            InstantiationException,
            IllegalAccessException,
            NoSuchFieldException
    {
        Class cla = User.class;
        
//        //1.获取类的类对象----三种方法
//        //1 getClass()
//        User user = new User();
//        User user1 = new User();
//
//        Class cla = user.getClass();
//        System.out.println(cla);
//        //输出类的全名
//        System.out.println(cla.getName());
//        //JVM只加载一次类，返回true
//        System.out.println(user.getClass() == user1.getClass();
//
//        //2 .class
//        Class cla = User.class;
//        Class cle = User.class;
//        System.out.println(cla);
//        //JVM只加载一次类，返回true
//        System.out.println(cla == cle);
//
//        //3 forName()
//        Class cla = Class.forName("User.User");
//        Class cle = Class.forName("User.User");
//        //JVM只加载一次类，返回true
//        System.out.println(cla);
//        System.out.println(cla == cle);

//        //2.获取类的构造方法
//        Constructor[] constructors1 = cla.getConstructors();
//        Constructor[] constructors2 = cla.getDeclaredConstructors();
//        Constructor constructor1 = cla.getConstructor(String.class);
//        Constructor constructor2 = cla.getDeclaredConstructor(int.class);
//
//        for(Constructor temp: constructors1)
//        {
//            System.out.println(temp);
//        }
//        System.out.println();
//
//        for(Constructor temp: constructors2)
//        {
//            System.out.println(temp);
//        }
//        System.out.println();
//
//        System.out.println(constructor3);
//        System.out.println();
//
//        System.out.println(constructor4);

//        //3.通过构造方法创建对象
//        Class cla = User.class;
//
//        Constructor constructor = cla.getDeclaredConstructor(String.class, int.class);
//
//        //通过执行构造方法创建对象
//        Object object = constructor.newInstance("Chen", 21);
//        User user = (User) object;
//
//        System.out.println(user);
        
//        //4.获取成员变量
//        Field[] fields1 = cla.getFields();
//        Field[] fields2 = cla.getDeclaredFields();
//
//        for(Field temp : fields1)
//        {
//            System.out.println(temp);
//            System.out.println(temp.getName());
//        }
//        System.out.println();
//
//        for(Field temp : fields2)
//        {
//            System.out.println(temp);
//
//        }
//
//        Field field1 = cla.getField("gender");
//        Field field2 = cla.getDeclaredField("userAge");
//
//        System.out.println(field1);
//        System.out.println(field2);
    
//        //5.通过获取的成员变量为其赋值
//        Class cla = User.class;
//
//        Field field = cla.getDeclaredField("gender");
//        //实例化对象
//        Object object =  cla.getConstructor(null).newInstance();
//
//        field.set(object, true);
//
//        System.out.println(field.get(object));
        
//        //6.获取方法
//        Method[] methods1 = cla.getMethods();
//        Method[] methods2 = cla.getDeclaredMethods();
//
//        for(Method temp: methods1)
//        {
//            System.out.println(temp);
//            System.out.println(temp.getName());
//        }
//        System.out.println();
//
//        for(Method temp: methods2)
//        {
//            System.out.println(temp);
//            System.out.println(temp.getName());
//        }
//        System.out.println();
//
//        Method method1 = cla.getMethod("setUserAge", int.class);
//        Method method2 = cla.getDeclaredMethod("SuiBian");
//
//        System.out.println(method1);
//        System.out.println();
//        System.out.println(method2);
        
//        //7.通过获取的方法操作方法
//        Method method1 = cla.getMethod("setUserAge", int.class);
//        //实例化对象
//        Object object = cla.getDeclaredConstructor(null).newInstance();
//
//        //通过set赋值
//        method1.invoke(object, 23);
//
//        //通过get获值
//        Method method = cla.getMethod("getUserAge");
//        System.out.println(method.invoke(object));
        
        //其它信息
        //获取类名
        System.out.println(cla.getName());
        System.out.println();
        //包名
        System.out.println(cla.getPackage());
        System.out.println();
        //超类
        System.out.println(cla.getSuperclass());
        System.out.println();
        //接口
        Class[] interFaces = cla.getInterfaces();
        for(Class temp : interFaces)
        {
            System.out.println(interFaces);
        }
    }
}
